/**
 * Copyright (c) 2008, Piercarlo Slavazza
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * The name of Piercarlo Slavazza cannot be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Piercarlo Slavazza ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Piercarlo Slavazza BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.libapml;

import com.libapml.util.Helper;

public class ConceptOccurrenceInDocument implements Closable {
  
	private Concept concept;
	private LuceneDocument document;

	private int occurrencies = 0;
	private double frequency = -1;
	private double tfidf = -1;
	
	private boolean closed = false;

	protected ConceptOccurrenceInDocument(
			Concept concept, 
			LuceneDocument document,
			int occurrencies) {
		
		this.concept = concept;
		this.document = document;
		this.occurrencies = occurrencies;
		
		concept.add(this);
		document.getIndex().addConceptOccurrenceInDocument(document, this);
		
	}

	public int getOccurrencies() {
		return occurrencies;
	}
	
	protected synchronized void close(double idf) {
		
		if (!closed) {
			document.close();

			frequency = (double) occurrencies / (double) document.getSize();

			tfidf = frequency * idf;
			
			closed = true;
		}
	}

	public synchronized double getFrequency() {
		
		Helper.checkIsClosed(this);
		
		return frequency;
	}

	public Concept getConcept() {
		return concept;
	}

	public synchronized double getTfidf() {
		
		if (!closed)
			throw new IllegalStateException("The instance has not been closed.");
		
		return tfidf;
	}

	public synchronized boolean isClosed() {
		return closed;
	}
	
}
